home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1993 / MacHack 1993.toast / MacHack™ 1987-1992 / MacHack™ '90 / Source Code ƒ / Misc. C ƒ / Recorder / Old / Anych Recorder.c #1 < prev    next >
Encoding:
Text File  |  1990-06-03  |  5.5 KB  |  236 lines  |  [TEXT/MPS ]

  1. /*    File: Recorder.c
  2.  
  3.     MPW Tool for recording serial line traffic
  4.     
  5. */
  6.  
  7.  
  8. #include <Types.h>
  9. #include <QuickDraw.h>
  10. #include <CursorCtl.h>
  11.  
  12. #include <CRMIntf.h>
  13. #include <CTBUtils.h>
  14. #include <CMIntf.h>
  15. #include <FTIntf.h>
  16. #include <TMIntf.h>
  17.  
  18. #include <StdIO.h>
  19. #include <StdLib.h>
  20.  
  21. pascal void SetupGlob ( void );
  22. pascal void ReadCompletionGlue1 ( ConnHandle hConn );
  23. pascal void ReadCompletionGlue2 ( ConnHandle hConn );
  24.  
  25. #define    CommToolBoxTrap        0x8B
  26. #define    UnimplementedTrap    0x9F
  27. #define    Check(err,str)    { \
  28.                         OSErr errXYZZY; \
  29.                         if (( errXYZZY = ( err )) != noErr ) \
  30.                             fprintf ( stderr, "Error %d calling %s\n", errXYZZY, str ); \
  31.                         }
  32. #define    OUTCONFIGSTR    "Baud 2400 dataBits 8 Parity None StopBits 1 Port \"Modem Port\"" \
  33.                         "Handshake None HoldConnection False RemindDisconnect False"
  34. #define    INCONFIGSTR        "Baud 2400 dataBits 8 Parity None StopBits 1 Port \"Printer Port\"" \
  35.                         "Handshake None HoldConnection False RemindDisconnect False"
  36.  
  37. #define        BUF_SIZE    1024
  38.  
  39. short        procID1;
  40. short        procID2;
  41. ConnHandle    stream1;
  42. ConnHandle    stream2;
  43. char        inBuffer1    [ BUF_SIZE ];
  44. char        outBuffer1    [ BUF_SIZE ];
  45. char        inBuffer2    [ BUF_SIZE ];
  46. char        outBuffer2    [ BUF_SIZE ];
  47. long        readSize1;
  48. long        writeSize1;
  49. long        readSize2;
  50. long        writeSize2;
  51. CMFlags        inFlags1;
  52. CMFlags        inFlags2;
  53. CMFlags        outFlags1;
  54. CMFlags        outFlags2;
  55.  
  56. /*    Is the Comm Toolbox actually installed ?? */
  57. Boolean        IsCTBInstalled    ( ) {
  58.     return NGetTrapAddress ( UnimplementedTrap, OSTrap ) !=
  59.             NGetTrapAddress ( CommToolBoxTrap, OSTrap );
  60.     }
  61.  
  62. short    InitAll ( void ) {
  63.     OSErr    err;
  64.  
  65.     InitGraf ( &qd.thePort );
  66. /*
  67.     InitFonts ();
  68.     InitWindows ();
  69.     InitMenus ();
  70.     TEInit ();
  71.     InitDialogs ( NULL );
  72.     InitCursor ();
  73. */
  74.  
  75.     InitCursorCtl ( NULL );
  76.     SetupGlob ();
  77.     
  78.     if ( !IsCTBInstalled ) {
  79.         fprintf ( stderr, "Comm Toolbox not installed!\n" );
  80.         return 1;
  81.         }
  82.  
  83. /*    Load up the Communications Toolbox */
  84.     (void) InitCTBUtilities ();
  85.     (void) InitCRM ();
  86.  
  87.     err = InitTM ();
  88.     if ( err == tmNoTools ) {
  89.         fprintf ( stderr, "No terminal tools found\n" );
  90.         return 2;
  91.         }
  92.     
  93.     err = InitCM ();
  94.     if ( err == cmNoTools ) {
  95.         fprintf ( stderr, "No connection tools found\n" );
  96.         return 2;
  97.         }
  98.     
  99.     err = InitFT ();
  100.     if ( err == ftNoTools ) {
  101.         fprintf ( stderr, "No file transfer tools found\n" );
  102.         return 2;
  103.         }        
  104.  
  105.     return 0;
  106.     }
  107.  
  108.  
  109. void ExitProc ( void ) {
  110.     DebugStr ( "\pExit" );
  111.     
  112. /*    Close the connection and dispose of the connection record */
  113.     if ( stream1 != NULL ) {
  114.         Check ( CMClose ( stream1, false, NULL, -1, true ), "CMCLose - input" );
  115.         CMDispose ( stream1 );
  116.         }
  117.  
  118.     if ( stream2 != NULL ) {
  119.         Check ( CMClose ( stream2, false, NULL, -1, true ), "CMCLose - output" );
  120.         CMDispose ( stream2 );
  121.         }
  122.     }
  123.  
  124. ConnHandle    InitStream ( short *procID ) {
  125.     CMBufferSizes    bSize;
  126.  
  127. /*    Open a connection tool */
  128.     bSize [ cmDataIn ] = BUF_SIZE;        bSize [ cmDataOut ] = BUF_SIZE;
  129.     bSize [ cmCntlIn ] = 0;                bSize [ cmCntlOut ] = 0;
  130.     bSize [ cmAttnIn ] = 0;                bSize [ cmAttnOut ] = 0;
  131.     bSize [ cmRsrvIn ] = 0;                bSize [ cmRsrvOut ] = 0;
  132.     *procID = CMGetProcID ( "\pSerial" );
  133.     return CMNew ( *procID, cmQuiet + cmNoMenus, bSize, 0L, 0L );
  134.     }
  135.                             
  136.  
  137. /*    Interrupt routine */
  138. pascal void ReadCompletion1 ( ConnHandle hConn ) {
  139.     ConnPtr    hcPtr;
  140.     
  141.     hcPtr = *hConn;
  142.     if ( hcPtr->errCode != noErr )
  143.         return;
  144.     writeSize1 = hcPtr->asyncCount [ cmDataIn ];
  145.     if ( writeSize1 > 0 ) {
  146.         BlockMove ( inBuffer1, outBuffer1, writeSize1 );
  147.         outFlags1 = inFlags1;
  148.         CMWrite ( stream2, outBuffer1, &writeSize1, 
  149.                     cmData, false, NULL, -1,  outFlags1 );
  150.         }
  151.  
  152. /*    re-enable the read */
  153.     readSize1 = 1;
  154.     CMRead ( stream1, inBuffer1, &readSize1,
  155.                 cmData, true, (ProcPtr) ReadCompletionGlue1, 0, &inFlags1 );
  156.     }
  157.  
  158.  
  159. /*    Interrupt routine */
  160. pascal void ReadCompletion2 ( ConnHandle hConn ) {
  161.     ConnPtr    hcPtr;
  162.     
  163.     hcPtr = *hConn;
  164.     if ( hcPtr->errCode != noErr )
  165.         return;
  166.     writeSize2 = hcPtr->asyncCount [ cmDataIn ];
  167.     if ( writeSize2 > 0 ) {
  168.         BlockMove ( inBuffer2, outBuffer2, writeSize2 );
  169.         outFlags2 = inFlags2;
  170.         CMWrite ( stream1, outBuffer2, &writeSize2, 
  171.                     cmData, false, NULL, -1,  outFlags2 );
  172.         }
  173.  
  174. /*    re-enable the read */
  175.     readSize2 = 1;
  176.     CMRead ( stream2, inBuffer2, &readSize2,
  177.                 cmData, true, (ProcPtr) ReadCompletionGlue2, 0, &inFlags2 );
  178.     }
  179.  
  180.  
  181. int main ( int argc, char *argv[] ) {
  182. #pragma unused ( argc )
  183. #pragma unused ( argv )
  184.     short    err;
  185.     long    cnt;
  186.     
  187.     if ( err = InitAll ( ) != 0 )
  188.         exit ( err );
  189.         
  190.     atexit ( ExitProc );
  191.  
  192. /*    Open a connection tool */
  193.     stream1 = InitStream ( &procID1 );
  194.     if ( stream1 == NULL ) {
  195.         fprintf ( stderr, "Cannot create input handle\n" );
  196.         return 3;
  197.         }
  198.         
  199. /*    Open another connection tool */
  200.     stream2 = InitStream ( &procID1 );
  201.     if ( stream2 == NULL ) {
  202.         fprintf ( stderr, "Cannot create output handle\n" );
  203.         return 3;
  204.         }
  205.  
  206. /*    Configure the connection */
  207.     Check ( CMSetConfig ( stream1, INCONFIGSTR ), "CMSetConfig - In" );
  208.     Check ( CMOpen ( stream1, false, NULL, -1 ), "CMOpen - In" );
  209.     Check ( CMListen ( stream1, false, NULL, -1 ), "CMListen - In" );
  210.     
  211.     Check ( CMSetConfig ( stream2, OUTCONFIGSTR ), "CMSetConfig - Out" );
  212.     Check ( CMOpen ( stream2, false, NULL, -1 ), "CMOpen - Out" );
  213.     Check ( CMListen ( stream2, false, NULL, -1 ), "CMListen - Out" );
  214.  
  215. /*    Do an ansych read on the input stream */
  216.     readSize1 = 1;
  217.     Check ( CMRead ( stream1, inBuffer1, &readSize1,
  218.                                 cmData, true, (ProcPtr) ReadCompletionGlue1, 0, &inFlags1 ), "CMRead" );
  219.     readSize2 = 1;
  220.     Check ( CMRead ( stream2, inBuffer2, &readSize2,
  221.                                 cmData, true, (ProcPtr) ReadCompletionGlue2, 0, &inFlags2 ), "CMRead" );
  222.     cnt = 0;
  223.     while ( true ) {
  224.         
  225.         cnt++;
  226.         if ( cnt % 256 == 0 ) {
  227.             CMIdle ( stream1 );
  228.             CMIdle ( stream2 );
  229.             SpinCursor ( 1 );
  230.             }
  231.             
  232.         }
  233.  
  234.     return 0;
  235.     }
  236.